`timescale 1ns/1ps

// 垂直转移模块
// 需要确认的事情：
//  1) 空闲状态下的驱动电位
//  2) 

module vTrans (
    input clk_v,            // 1MHz
    input vtrans_en,
    input [31:0] ccd_I1_A,
    input [31:0] ccd_I1_B,
    input [31:0] ccd_I2_A,
    input [31:0] ccd_I2_B,
    input [31:0] ccd_I3_A,
    input [31:0] ccd_I3_B,
    input [31:0] ccd_I4_A,
    input [31:0] ccd_I4_B,
    input [31:0] ccd_Ix_MAX, //计数器的最大值，用于判定一次垂直转移是否已经结束

    output ccd_I1,
    output ccd_I2,
    output ccd_I3,
    output ccd_I4,
    output vtrans_done      // 当它拉高时,上层模块就知道一次垂直转移完成了
    );

reg [31:0] cnt = 32'd0;

always@( posedge clk_v ) begin
    if( vtrans_en == 1'b1 ) begin
        cnt <= cnt + 32'd1;
    end
    else begin
        cnt <= 32'd0;
    end
end

assign ccd_I1 =  ( cnt >= ccd_I1_A) & (cnt < ccd_I1_B );
assign ccd_I2 = ~((cnt >= ccd_I2_A) & (cnt < ccd_I2_B));
assign ccd_I3 = ~((cnt >= ccd_I3_A) & (cnt < ccd_I3_B));
assign ccd_I4 =  ( cnt >= ccd_I4_A) & (cnt < ccd_I4_B );

assign vtrans_done  = (cnt >= ccd_Ix_MAX);

endmodule